package com.edu.exam.entity.grading.export;

import com.edu.exam.enums.GradeExportFormat;
import com.edu.exam.enums.GradeExportTaskType;
import com.edu.exam.enums.GradeExportType;
import com.edu.exam.enums.grading.GradingTaskStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩导出任务实体类
 * [所属模块] G-04 成绩导出模块
 * 对应数据库表：grade_export_task
 *
 *
 * <p>成绩导出任务实体用于管理成绩导出任务的核心信息，包含
 * 任务基本信息、执行状态、文件信息、安全配置等。为成绩导出功能提供完整的任务管理。</p>
 *
 * <p>核心功能：
 * - 任务管理：管理导出任务的完整生命周期
 * - 状态跟踪：跟踪任务执行状态和进度
 * - 文件管理：管理导出文件和元数据
 * - 安全控制：控制文件访问和数据安全
 * - 重试机制：支持失败重试和错误恢复</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeExportTask {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 任务名称
     *
     * <p>导出任务的名称标识。</p>
     */
    @Column(name = "task_name", nullable = false, length = 100)
    private String taskName;

    /**
     * 用户ID
     *
     * <p>发起导出任务的用户ID。</p>
     */
    @Column(name = "user_id", nullable = false, length = 50)
    private String userId;

    /**
     * 任务类型
     *
     * <p>导出任务的类型。
     * 支持的类型：SINGLE（单次导出）、BATCH（批量导出）、SCHEDULED（定时导出）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "task_type", nullable = false, length = 20)
    private GradeExportTaskType taskType;

    /**
     * 导出类型
     *
     * <p>导出数据的类型。
     * 支持的类型：GRADE（成绩数据）、ANALYSIS（分析结果）、REPORT（报告数据）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "export_type", nullable = false, length = 20)
    private GradeExportType exportType;

    /**
     * 导出格式
     *
     * <p>导出文件的格式。
     * 支持的格式：EXCEL（Excel文件）、CSV（CSV文件）、PDF（PDF文件）、JSON（JSON文件）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "format", nullable = false, length = 20)
    private GradeExportFormat format;

    /**
     * 模板
     *
     * <p>导出使用的模板名称。</p>
     */
    @Column(name = "template", length = 100)
    private String template;

    /**
     * 任务参数
     *
     * <p>导出任务的参数配置，JSON格式存储。</p>
     */
    @Lob
    @Column(name = "parameters", columnDefinition = "TEXT")
    private String parameters;

    /**
     * 任务状态
     *
     * <p>导出任务的执行状态。
     * 支持的状态：CREATED（已创建）、PENDING（待处理）、PROCESSING（处理中）、COMPLETED（已完成）、FAILED（失败）、CANCELLED（已取消）、RETRYING（重试中）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false, length = 20)
    private GradingTaskStatus status = GradingTaskStatus.CREATED;

    /**
     * 文件路径
     *
     * <p>导出文件的存储路径。</p>
     */
    @Column(name = "file_path", length = 500)
    private String filePath;

    /**
     * 文件大小
     *
     * <p>导出文件的字节大小。</p>
     */
    @Column(name = "file_size")
    private Long fileSize;

    /**
     * 文件校验和
     *
     * <p>导出文件的MD5校验和。</p>
     */
    @Column(name = "checksum", length = 100)
    private String checksum;

    /**
     * 记录数量
     *
     * <p>导出的记录数量。</p>
     */
    @Column(name = "record_count")
    private Integer recordCount;

    /**
     * 开始时间
     *
     * <p>任务开始处理的时间。</p>
     */
    @Column(name = "start_time")
    private LocalDateTime startTime;

    /**
     * 结束时间
     *
     * <p>任务完成的时间。</p>
     */
    @Column(name = "end_time")
    private LocalDateTime endTime;

    /**
     * 处理时长
     *
     * <p>任务处理的时长（毫秒）。</p>
     */
    @Column(name = "processing_duration_ms")
    private Long processingDurationMs;

    /**
     * 错误信息
     *
     * <p>任务执行失败的错误信息。</p>
     */
    @Column(name = "error_message", length = 1000)
    private String errorMessage;

    /**
     * 错误代码
     *
     * <p>任务执行失败的错误代码。</p>
     */
    @Column(name = "error_code", length = 50)
    private String errorCode;

    /**
     * 重试次数
     *
     * <p>任务重试的次数。</p>
     */
    @Column(name = "retry_count")
    private Integer retryCount = 0;

    /**
     * 最大重试次数
     *
     * <p>任务允许的最大重试次数。</p>
     */
    @Column(name = "max_retry_count")
    private Integer maxRetryCount = 3;

    /**
     * 下次重试时间
     *
     * <p>任务下次重试的时间。</p>
     */
    @Column(name = "next_retry_time")
    private LocalDateTime nextRetryTime;

    /**
     * 优先级
     *
     * <p>任务的优先级，数值越大优先级越高。</p>
     */
    @Column(name = "priority")
    private Integer priority = 0;

    /**
     * 下载次数
     *
     * <p>文件被下载的次数。</p>
     */
    @Column(name = "download_count")
    private Integer downloadCount = 0;

    /**
     * 最后下载时间
     *
     * <p>文件最后被下载的时间。</p>
     */
    @Column(name = "last_download_time")
    private LocalDateTime lastDownloadTime;

    /**
     * 过期时间
     *
     * <p>文件的过期时间。</p>
     */
    @Column(name = "expire_time")
    private LocalDateTime expireTime;

    /**
     * 是否加密
     *
     * <p>标记文件是否加密。</p>
     */
    @Column(name = "is_encrypted", nullable = false)
    private Boolean isEncrypted = false;

    /**
     * 加密信息
     *
     * <p>文件加密的相关信息，JSON格式存储。</p>
     */
    @Column(name = "encryption_info", columnDefinition = "TEXT")
    private String encryptionInfo;

    /**
     * 是否压缩
     *
     * <p>标记文件是否压缩。</p>
     */
    @Column(name = "is_compressed", nullable = false)
    private Boolean isCompressed = false;

    /**
     * 压缩信息
     *
     * <p>文件压缩的相关信息，JSON格式存储。</p>
     */
    @Column(name = "compression_info", columnDefinition = "TEXT")
    private String compressionInfo;

    /**
     * 任务描述
     *
     * <p>导出任务的详细描述。</p>
     */
    @Column(name = "description", length = 500)
    private String description;

    /**
     * 附加信息
     *
     * <p>任务的附加信息，JSON格式存储。</p>
     */
    @Column(name = "additional_info", columnDefinition = "TEXT")
    private String additionalInfo;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建人
     */
    @Column(name = "created_by", length = 50)
    private String createdBy;

    /**
     * 更新人
     */
    @Column(name = "updated_by", length = 50)
    private String updatedBy;

    /**
     * 版本号
     *
     * <p>任务记录的版本号。</p>
     */
    @Version
    @Column(name = "version", nullable = false)
    private Integer version = 1;

    /**
     * 是否删除
     *
     * <p>逻辑删除标记。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;



    
    // ===== 业务方法 =====

    /**
     * 开始任务
     *
     * <p>将任务状态设置为处理中并记录开始时间。</p>
     */
}
